const Scheduler = require('./services/scheduler');
const logger = require('./utils/logger');
require('dotenv').config();

class DirectusScheduleApp {
  constructor() {
    this.scheduler = new Scheduler();
  }

  // 启动应用
  async start() {
    try {
      logger.info('='.repeat(50));
      logger.info('启动 Directus 定时订单生成系统');
      logger.info('='.repeat(50));

      // 启动调度器
      this.scheduler.start();

      // 设置进程退出处理
      this.setupGracefulShutdown();

      logger.info('系统启动完成！');
      logger.info('系统将根据 Directus 中的配置自动生成订单');
      logger.info('按 Ctrl+C 停止系统');

    } catch (error) {
      logger.error('启动系统失败:', error);
      process.exit(1);
    }
  }

  // 优雅关闭
  setupGracefulShutdown() {
    const shutdown = (signal) => {
      logger.info(`收到 ${signal} 信号，正在关闭系统...`);

      this.scheduler.stop();

      logger.info('系统已安全关闭');
      process.exit(0);
    };

    process.on('SIGINT', () => shutdown('SIGINT'));
    process.on('SIGTERM', () => shutdown('SIGTERM'));

    // 处理未捕获的异常
    process.on('uncaughtException', (error) => {
      logger.error('未捕获的异常:', error);
      this.scheduler.stop();
      process.exit(1);
    });

    process.on('unhandledRejection', (reason, promise) => {
      logger.error('未处理的 Promise 拒绝:', reason);
      this.scheduler.stop();
      process.exit(1);
    });
  }

  // 手动触发订单生成（用于测试）
  async triggerManualGeneration() {
    try {
      await this.scheduler.triggerOrderGeneration();
    } catch (error) {
      logger.error('手动触发失败:', error);
    }
  }

  // 获取系统状态
  getStatus() {
    return {
      uptime: process.uptime(),
      memory: process.memoryUsage(),
      tasks: this.scheduler.getTaskStatus()
    };
  }
}

// 创建应用实例
const app = new DirectusScheduleApp();

// 如果直接运行此文件，启动应用
if (require.main === module) {
  app.start().catch(error => {
    logger.error('应用启动失败:', error);
    process.exit(1);
  });

  // 监听 HTTP 请求，处理手动触发订单生成
}

module.exports = DirectusScheduleApp;
